package main;

import Matrices.Matriz;
import Matrices.Permutaciones;
import Matrices.Vector;
import clases.*;
import clases.Vectores.ElementoVector;
import clases.Vectores.Vectores;
import java.io.IOException;

/**
  *  4g3nt
  *  Copyright (C) 2008  Carlos Molinero y César Andrés
  *
  *  This program is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation, either version 3 of the License, or
  *  (at your option) any later version.
  *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
  *
  *    You should have received a copy of the GNU General Public License
  *    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  */
public class Principal {
	public static void pedido2()
	{
		String trabajo="FC2";
		//Preguntamos a la celula Inicial si existe alguien que hace el trabajo.
		Celula principal = Global.getCelula(Global.getMundo().getCelula());
		Agente var_agente= principal.haceTrabajo(trabajo);
		if (var_agente!=null)
		{
			var_agente.realizaTrabajo();
		}else
		{
			var_agente = new Agente();
			var_agente.setCelula(Global.getMundo().getCelula());
			String id= trabajo+System.currentTimeMillis();
			var_agente.setId(id);
			var_agente.setFuncionUtilidad("");
			principal.setAgente(var_agente);
			Mensajes mensaje = Mensajes.mensajeIdentificacion(new ParesAC(id,Global.getMundo().getCelula()), trabajo);
			principal.sendMessage(mensaje);
		}
		
	}
        public static void programa1() throws IOException
        {
	    System.out.println("Cargando el sistema:");
	    ReadFromXML reader = new ReadFromXML("src/data/configuration.xml");
	
	    System.out.println("Escribir el mundo: pulsa p");
	    System.out.println("Pedido 2: pulsa 2");
	    System.out.println("Pedido 1: pulsa 1");
	    System.out.println("salir pulsa: s");
	    Global.inicializa("index.html");
		reader.leerall();
		//pintamos el mundo;
		Global.printMundo();
		Global.ejecutaThreads();
	    int i;
	    while ((i = System.in.read()) != -1) {
	      char ch = (char)i;
	      switch(ch) {
	        case 's':  {
	        			Global.escribir("</table>");
	        			Global.cerrar(); 
	        			Global.matarThreads();
	        			System.exit(0);
	        			}
	        case 'p':  Global.printMundo(); break;
	        case '2':{
	        	Global.escribir("<table class=\"tabla\"><tr><th>Accion</th><th>Tipo Mensaje</th><th>Origen(celula,agente)</th><th>Destino(celula,agente)</th><th>Tiempo</th><th>Funcion Construccion</th><th>Funcion Destruccion</th><th>Tiempo Sistema</th></tr>");
	        	pedido2();
	        	
	        	break;
	        }
	      }		
		
		}return;
        }
        /**
         * Prueba de Matrices
         */
        public static void programa21() 
        {
        //sistema de ecuaciones lineales
        double[][] m1={{1, 0, -1}, {0, 1, -1}, {-1, -1, 0}};
        
        Matriz coef=new Matriz(m1);
        System.out.println("determinante "+coef.determinante());
        double[] n1={1, 1, 1};
        Vector ter=new Vector(n1);
        Vector solucion=Matriz.producto(Matriz.inversa(coef), ter);
        System.out.println("solución "+solucion);
        }
        public static void programa23() 
        {
        //sistema de ecuaciones lineales
        double[][] m1={{1, 1}, {1,0}};
        Matriz coef=new Matriz(m1);
        System.out.println("determinante "+coef.determinante());
        double[] n1={1, 1};
        Vector ter=new Vector(n1);
        Vector solucion=Matriz.producto(Matriz.inversa(coef), ter);
        System.out.println("solución "+solucion);
        }
        
        
        public static void programa22()
	{
        //Vectores y matrices
        double[][] a1={{1, 2, 3},{4,5,6},{7,8,9}};
        Matriz a=new Matriz(a1);
        double[] v1={1,2,3};
        Vector v=new Vector(v1);
        Vector r=Matriz.producto(v, a);
        System.out.println("Vector "+r);
        r=Matriz.producto(a, v);
        System.out.println("Vector "+r);
        //matrices
        double[][] b1={{1, 0, -1},{2,1,3},{-1, 0, 2}};
        Matriz b=new Matriz(b1);
        Matriz re=Matriz.suma(a, b);
        System.out.println("matriz "+re);
        re=Matriz.producto(a, b);
        System.out.println("matriz "+re);
        //Número por una matriz
        re=Matriz.producto(a, 2.0);
        System.out.println("matriz "+re);
        re=Matriz.producto(2.0, a);
        System.out.println("matriz "+re);
        //determinantes
        System.out.println("determinante "+b.determinante());
        System.out.println("determinante "+a.determinante());
        double[][] h1={{3, 1, -1, 2, 1},{-2, 3, 1, 4, 3},{1, 4, 2, 3, 1},{5, -2, -3, 5, -1},{-1, 1, 2, 3, 2}};
        Matriz h=new Matriz(h1);
        System.out.println("determinante "+h.determinante());
        //matriz inversa
        double[][] c1={{1.8, -3.8, 0.7, -3.7},{0.7, 2.1, -2.6, -2.8},{7.3, 8.1, 1.7, -4.9},{1.9, -4.3, -4.9, -4.7}};
        Matriz c=new Matriz(c1);
        Matriz in=Matriz.inversa(c);
        System.out.println("matriz inversa "+in);
        System.out.println("matriz unidad "+Matriz.producto(c, in));
        //sistema de ecuaciones lineales
        double[][] m1={{3, -1, 0}, {-2, 1, 1}, {2, -1, 4}};
        Matriz coef=new Matriz(m1);
        double[] n1={5, 0, 15};
        Vector ter=new Vector(n1);
        Vector solucion=Matriz.producto(Matriz.inversa(coef), ter);
        System.out.println("solución "+solucion);
        //otro sistema de ecuaciones
        double[][] m2={{7.9, 5.6, 5.7, -7.2}, {8.5, -4.8, 0.8, 3.5}, {4.3, 4.2, -3.2, 9.3}, {3.2, -1.4, -8.9, 3.3}};
        coef=new Matriz(m2);
        double[] n2={6.68, 9.95, 8.6, 1};
        ter=new Vector(n2);
        solucion=Matriz.producto(Matriz.inversa(coef), ter);
        System.out.println("solución "+solucion);
        //polinomio característico
        double[][] p1={{1,2,3,4},{2,1,2,3},{3,2,1,2},{4,3,2,1}};
        Matriz p=new Matriz(p1);
        double pol[]=p.polCaracteristico();
        System.out.println("Polinomio característico");
        for(int i=0; i<pol.length; i++){
            System.out.print((double)Math.round(pol[i]*1000)/1000+" , ");
        }
        System.out.println();
        //valores propios y vectores propios
        System.out.println("Valores y vectores propios ");
        double[][] val1={{7, -1, -1}, {-1, 5, 1},{-1, 1, 5}};
        Matriz matriz=new Matriz(val1);
        Matriz vectores=new Matriz(matriz.getDimension());
        double[] valores=new double[matriz.getDimension()];
        
        vectores=matriz.valoresPropios(valores, 20);

       //valores propios
       for(int i=0; i<matriz.getDimension(); i++)
        	System.out.print(valores[i]+" , ");
        System.out.println();
        System.out.println(vectores);       
        //vectores propios
        }
        public static void programa3()
        {
            int[] var_vector = {1,2,3,4};
            Permutaciones permutaciones=new Permutaciones (var_vector);
            permutaciones.imprimir();
            while(permutaciones.cambio())
            {
                permutaciones.imprimir();
            }
        }
        public static void programa4()
        {
            Vectores a = new Vectores();
            Vectores b = new Vectores();
            a.addRecurso(new ElementoVector("paga",1000));
            a.addRecurso(new ElementoVector("pato",1000));
            a.addRecurso(new ElementoVector("mesa",1000));
            System.out.println("Vector a");
            System.out.println(a);
            System.out.println("Vector b");
            System.out.println(b);
            System.out.println("Normalizar b con a");
            System.out.println(Vectores.normalizar(a,b));
            b.addRecurso(new ElementoVector("paga",300));
            System.out.println("Normalizar b con a");
            System.out.println(Vectores.normalizar(a,b));
        }
	/**
         * 
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
            //Principal.programa1();
            //Principal.programa21() ;
            //Principal.programa22() ;
            //Principal.programa23() ;
            //Principal.programa3() ;
            Principal.programa4() ;
 
        }
}